package com.dongdongshop.aop;

import com.alibaba.fastjson.JSONObject;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * 定义日志切面类 ：
 * aop ： 一种是通过xml配置
 * 二种是注解方式
 */
@Component // 将切面类放到spring容器中
@Aspect
public class LoggerAspect {
    private final Logger logger = LoggerFactory.getLogger(LoggerAspect.class);

    //定义切点表达式
    @Pointcut("execution(public * com.dongdongshop.service..*.*(..))")
    public void aopLogeer() {
    }

    //定义前置通知
    @Before("aopLogeer()")
    public void doBefore(JoinPoint joinPoint) throws Throwable {
        //获取参数
        Object[] args = joinPoint.getArgs();
        //获取切点(正在被代理的方法)
        Signature signature = joinPoint.getSignature();

        logger.info("进入方法: {} , 参数为 ：{} ", signature, args);

    }

    //定义后置通知
    // doAfter(Object result) ： 参数为被代理的方法的返回值
    @AfterReturning(value = "aopLogeer()", returning = "result")
    public void doAfter(Object result) throws Throwable {
        //处理请求成功后，打印返回的结果
        logger.info("方法执行成功,返回值为： {} ", JSONObject.toJSONString(result));
    }
}
